package com.rbac.admin.utils;

import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Base64;
import java.util.UUID;

/**
 * 文件处理工具类
 */
public class FileUtils {

    /**
     * 默认上传的位置
     */
    private static final String BASE_PATH = "C:\\java\\nginx\\path\\to\\save\\school-Rbac\\";
    
    /**
     * 默认的访问URL前缀
     */
    private static final String BASE_URL = "http://192.168.1.104:3031/system/file/school-Rbac/";

    /**
     * 检测字符串是否为Base64编码的图片
     * 
     * @param data 待检测的字符串
     * @return 是否为Base64图片
     */
    public static boolean isBase64Image(String data) {
        return data != null && data.startsWith("data:image/");
    }
    
    /**
     * 从Base64数据中提取文件扩展名
     *
     * @param base64Data Base64数据
     * @return 文件扩展名
     */
    public static String getExtensionFromBase64(String base64Data) {
        if (base64Data == null || !base64Data.startsWith("data:image/")) {
            return "png"; // 默认扩展名
        }
        
        // 数据格式：...
        String mimeType = base64Data.substring(5, base64Data.indexOf(";"));
        
        switch (mimeType) {
            case "image/jpeg":
                return "jpg";
            case "image/png":
                return "png";
            case "image/gif":
                return "gif";
            case "image/bmp":
                return "bmp";
            case "image/webp":
                return "webp";
            default:
                return "png";
        }
    }
    
    /**
     * 从Base64数据URL中提取数据部分
     *
     * @param base64DataUrl Base64数据URL
     * @return Base64数据
     */
    public static String extractBase64Data(String base64DataUrl) {
        if (base64DataUrl == null || !base64DataUrl.contains(",")) {
            return base64DataUrl;
        }
        return base64DataUrl.substring(base64DataUrl.indexOf(",") + 1);
    }
    
    /**
     * 将Base64图片数据转换为字节数组
     * 
     * @param base64Data Base64图片数据
     * @return 图片字节数组
     */
    public static byte[] base64ToBytes(String base64Data) {
        // 提取实际的Base64内容
        String data = isBase64Image(base64Data) ? extractBase64Data(base64Data) : base64Data;
        return Base64.getDecoder().decode(data);
    }
    
    /**
     * 生成唯一文件名
     *
     * @param extension 文件扩展名
     * @return 唯一文件名
     */
    public static String generateUniqueFilename(String extension) {
        // 使用当前日期和UUID生成唯一文件名
        String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
        String uuid = UUID.randomUUID().toString().replace("-", "");
        
        return dateStr + "_" + uuid + (extension != null ? "." + extension : "");
    }
    
    /**
     * 将Base64图片数据保存为文件（仅在需要时调用）
     * 
     * @param base64Data Base64图片数据
     * @return 文件访问URL
     * @throws IOException 如果保存失败
     */
    public static String saveBase64ImageIfNeeded(String path,String base64Data) throws IOException {
        // 如果不是Base64图片数据，则原样返回
        if (!isBase64Image(base64Data)) {
            return base64Data;
        }
        
        // 获取图片格式
        String extension = getExtensionFromBase64(base64Data);
        
        // 生成文件名
        String filename = generateUniqueFilename(extension);
        
        // 检查并创建目录
        File directory = new File(BASE_PATH+path+"\\");
        if (!directory.exists()) {
            boolean created = directory.mkdirs();
            if (!created) {
                throw new IOException("无法创建目录: " + BASE_PATH+path+"\\");
            }
        }
        
        // 将Base64转换为字节数组
        byte[] imageBytes = base64ToBytes(base64Data);
        
        // 保存文件
        Path targetPath = Paths.get(BASE_PATH+path+"\\", filename);
        Files.write(targetPath, imageBytes);
        
        // 返回访问URL
        return BASE_URL+path+"/" + filename;
    }
} 